package controleur;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;

import javax.media.Player;
import javax.media.rtp.RTPManager;
import javax.swing.RepaintManager;

import Econf_Audio.Emetteur_client;
import Econf_Audio.Receveur_client;

import model.*;
import vue.*;

public class Control implements ActionListener {
	
	// Attributs
	int etatControl;
	private Fenetre fenetre;
	private eConf eConf;
	private String loginProfile, loginConnexion;
	private boolean confirmProfile;
	private InetAddress ipClient;
	private Object[] tabInfosProfileUtilisateurCourant; // Contenu du tableau (prenom (0), nom (1), login (2) et mail (3))
	
	
	

	// Observateur
	public int getEtatControl() {return etatControl;}
	
	
	public String getTabInfosProfileUtilisateurCourant(int i) {
		return (String) tabInfosProfileUtilisateurCourant[i];
	}

	public Control(Fenetre fe, eConf econf, String loginConnexion) {
		fenetre = fe;
		eConf = econf;
		this.loginConnexion = loginConnexion;
	}
	
	public Control(Fenetre fe, eConf econf) {
		fenetre = fe;
		eConf = econf;
	}
	
	public Control(Fenetre fe, eConf econf, String IDProfile, boolean confirmDemandeDeProfile) {
		fenetre = fe;
		eConf = econf;
		loginProfile = IDProfile;
		confirmProfile = confirmDemandeDeProfile;
	}

 // Définition des actions
	@Override
	public void actionPerformed(ActionEvent arg0) {
		
		// réinitialise l'etat
		etatControl = Constantes.NULL;
		
		
		/*
		 * * REPONSE CLIC BUTON MENU
		 */
		
		// Détermination du type d'action "Menu Panel"
		if (arg0.getActionCommand().equals("Accueil")){
			etatControl = Constantes.ACCUEIL;
			// Demande au serveur une réponse a cette demande
			eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_INFOS_PERSONELLES_UTILISATEUR, "Demande informations personnelles utilisateur courant");
			tabInfosProfileUtilisateurCourant=eConf.ReceptionObjet1DFromServer();
			fenetre.afficheBodyAccueil(this.getTabInfosProfileUtilisateurCourant(0),this.getTabInfosProfileUtilisateurCourant(1));
		}
		if (arg0.getActionCommand().equals("Conférences")){
			etatControl = Constantes.CONFERENCE;
			// Affiche le chargement
					fenetre.afficheChargement();
			// Demande au serveur une réponse a cette requete
				// demande Serveur la liste des conférences
				eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_LISTE_CONFERENCE_PRIVEE, "Demande la liste des conférences prive");
				// Receivre tableau of server
				Object tabReceivePri[][] = eConf.ReceptionObjet2DPourConferenceFromClient();
				// demande le suivant
				eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_LISTE_CONFERENCE_PUBLIQUE, "Demande la liste des conférences publique");
				// Receivre tableau of server
				Object tabReceivePub[][] = eConf.ReceptionObjet2DPourConferenceFromClient();
			// with resultat of server
//			fenetre.afficheBodyConferences(controleur.List.getDonneesLocalInfoConference());
			fenetre.afficheBodyConferences(tabReceivePri, tabReceivePub);

		}
		
		// Quiter la conférence
		if (arg0.getActionCommand().equals("Fin de conférence")){
			System.out.println("Action Fin de conférence");
			// Get info of user
				eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_INFOS_PERSONELLES_UTILISATEUR, "Demande informations personnelles utilisateur courant");
				Object[] profile = eConf.ReceptionObjet1DFromServer();
				String DN = profile[0].toString()+" "+profile[1].toString();
			// Informe le serveur de la demande
				String description = eConf.getIdConfActuelle()+"@"+DN;
			// Envoie au serveur une demande Conférence (idConf, DN, action)
				eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_QUITE_CONFERENCE, description);
				eConf.RecoiReponseDuServeur();
			
			// Kill etat de la conférence
			fenetre.getPanneauMenu().isEnableButtonMenu(true);
			fenetre.getPanneauMenu().ButtonConferenceVisible(false);
			// Stop les récepteurs
				// Ferme le player du client
				Player playerClient = Receveur_client.player;
				playerClient.close();
				// get manager de l'emetteur client si exist
				try {
					RTPManager[] emetteur = Emetteur_client.rtpm;
					for (int i = 0; i < emetteur.length; i++) {
						emetteur[i].dispose();
					}
				} catch (Exception e) {
					System.err.println("Erroeur: emetteur[i].dispose(), car il n'existe pas.");
				}
			//set false l'etat de la conférenceonAir
			eConf.setConferenceOnAir(false);
			Conference conference = new Conference(eConf, eConf.getIp_Serveur());
			conference.setFinConference(false);
			conference.start();
			// Affichage des infos utilisateur pour iune demande body 
			eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_INFOS_PERSONELLES_UTILISATEUR, "Demande informations personnelles utilisateur courant");
			tabInfosProfileUtilisateurCourant = eConf.ReceptionObjet1DFromServer();
		
			fenetre.afficheBodyAccueil(this.getTabInfosProfileUtilisateurCourant(0),this.getTabInfosProfileUtilisateurCourant(1));
		}
		
		if (arg0.getActionCommand().equals("Créer Conférence")){
			etatControl = Constantes.CREER_CONFERENCE;
			// Demande au serveur une réponse a cette requete
			eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_LISTE_PARTICIPANT, "Demande liste des participants");
			Object[] tabParticipant= eConf.ReceptionObjet1DFromServer();
			
			fenetre.afficheBodyCreerConferences(tabParticipant);
		}
		if (arg0.getActionCommand().equals("Profile")){
			etatControl = Constantes.PROFILE;
			// Demande au serveur une réponse a cette requete
			eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_INFOS_PERSONELLES_UTILISATEUR, "Demande informations personnelles utilisateur courant");
			tabInfosProfileUtilisateurCourant=eConf.ReceptionObjet1DFromServer();
			fenetre.afficheBodyProfile((String)tabInfosProfileUtilisateurCourant[0],(String)tabInfosProfileUtilisateurCourant[1],(String)tabInfosProfileUtilisateurCourant[2],(String)tabInfosProfileUtilisateurCourant[3]);
		}
		if ((arg0.getActionCommand().equals("Demande Profile")) | (arg0.getActionCommand().equals("Update"))){
			//etatControl = Constantes.DEMANDE_PROFILE;
			// Demande au serveur une réponse a cette requete
				eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_VALIDATION_PROFILE, "Demande la liste des profiles en atente");
			// Réception de la réponse
				Object[][] tabInfosDuServeur = eConf.ReceptionObjet2DPourDemandeProfileFromClient();
			// Affiche la vu grâce au infos du tableau
				fenetre.afficheBodyDemandeProfile(tabInfosDuServeur);
		}
		//Modification YO - Monitoring
		if (arg0.getActionCommand().equals("Supervision")){
			etatControl = Constantes.SUPERVISION;
			// Demande au serveur une réponse a cette requete
			eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_INFO_SUPERVISION, "Demande des infos de supervision");
			//Reception de la réponse
			Object[][] tabInfosSupervisionDuServeur = eConf.ReceptionObjet2DFromClientSupervision();
			fenetre.afficheBodySupervision(tabInfosSupervisionDuServeur);
		}
		if (arg0.getActionCommand().equals("Connexion")){
			etatControl = Constantes.CONNEXION;
			// Demande au serveur une réponse a cette requete
			fenetre.afficheBodyConnexion();
		}
		if (arg0.getActionCommand().equals("Déconnexion")){
			etatControl = Constantes.DECONNEXION;
			 eConf.getUcd().setFinUcd(true);
			// Demande au serveur une réponse a cette requete
			fenetre.afficheBodyDeconnexion();
		}
		if (arg0.getActionCommand().equals("Inscription")){
			etatControl = Constantes.INSCRIPTION;
			// Demande au serveur une réponse a cette requete
			fenetre.afficheBodyInscription();
		}
		if (arg0.getActionCommand().equals("Quitter")){
			etatControl = Constantes.QUITTER;
			// Pas de demande au serveur
			eConf.closeEConf();
		}
		if (arg0.getActionCommand().equals("A Propos")){
			etatControl = Constantes.A_PROPOS;
			// Pas de demande au serveur
			fenetre.afficheBodyAPropos();
		}
		
		/*
		 * * REPONSE FORMULAIRE
		 */
		
		//Demande de connexion information du formulaire
		 // Validation du formulaire de connexion
		if (arg0.getActionCommand().equals("Valider")){
			// collecte des info envoie au serveur les infos
			if(fenetre.demandeBodyConnexion()){ 
				// Demande des informations de l'utilisateur
				eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_INFOS_PERSONELLES_UTILISATEUR, "Demande informations personnelles utilisateur courant");
				tabInfosProfileUtilisateurCourant=eConf.ReceptionObjet1DFromServer();
				fenetre.afficheBodyAccueil((String)tabInfosProfileUtilisateurCourant[0],(String)tabInfosProfileUtilisateurCourant[1]);
				}
			// Réponse du server
					// value = rep du serveur a terme
			// Affiche la page d'accueil pour l'utilisateur
					// fenetre.afficheBodyAccueil();
		}
		// Validation du Formulaire de création d'un nouveau profil
		if (arg0.getActionCommand().equals("Valider Inscription")){
			// collecte des info envoie au serveur les infos
			fenetre.demandeBodyInscription();
			// Réponse du server
		}
		// Validation du Formulaire de création d'une conférence
		if (arg0.getActionCommand().equals("Valider Conférence")){
			// collecte des infos envoie au serveur les infos
			
			if(fenetre.demandeBodyCreerConference()){
				//  Redirige sur une page ??????????????
				
			}
			
					// Confirmation d'ajout
			// Vu sur les conférences
			// Réponse du server
		}
		// Validation du Formulaire pour rejoindre une conférence
				if (arg0.getActionCommand().equals("Rejoindre Conférence")){
					System.out.println("Clic Rejoindre conf");
					
					// collecte des infos envoie au serveur les infos
					int idConf = fenetre.getidConf();
					String id = new String(""+idConf);
					try {
						ipClient = InetAddress.getLocalHost();
					} catch (UnknownHostException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					String roleUser = fenetre.getRoleUser(idConf);
					String description =  id+"@"+ipClient+"@"+fenetre.getInputLoginConnexion().getText()+"@"+fenetre.getRoleUser(idConf);
					// 	Affiche le chargement
						fenetre.afficheChargement();
					eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_REJOINDRE_CONFERENCE, description );

					eConf.setIdConfActuelle(id);
					eConf.setRoleUserConferenceActuel(roleUser);
					eConf.setIdConferenceActuel(id);
					fenetre.getPanneauMenu().isEnableButtonMenu(false);
					fenetre.getPanneauMenu().ButtonConferenceVisible(true);
					eConf.setConferenceOnAir(true);
					
					System.out.println("Quit la classe Control");
				}
			
				// Validation du Formulaire pour rejoindre une conférence publique
				if (arg0.getActionCommand().equals("Rejoindre Conférence publique")){
					System.out.println("Clic Rejoindre conf Pub");
					// collecte des infos envoie au serveur les infos
					int idConfPub = fenetre.getidConfPub();
					String id = new String(""+idConfPub);
					try {
						ipClient = InetAddress.getLocalHost();
					} catch (UnknownHostException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					String description =  id+"@"+ipClient+"@"+fenetre.getInputLoginConnexion().getText()+"@"+fenetre.getRoleUserPublique(idConfPub);
					eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_REJOINDRE_CONFERENCE, description );
	
					eConf.setIdConfActuelle(id);
					String roleUser = fenetre.getRoleUser(idConfPub);
					eConf.setRoleUserConferenceActuel(roleUser);
					eConf.setIdConferenceActuel(id);
					fenetre.getPanneauMenu().isEnableButtonMenu(false);
					fenetre.getPanneauMenu().ButtonConferenceVisible(true);
					eConf.setConferenceOnAir(true);
				}
		
		/*
		 * * Action demande de profile
		 */
			if (arg0.getActionCommand().equals("")){
				System.out.println("Event: "+arg0.getActionCommand().toString());
			// L'admin confirme la demande de profile
				if (confirmProfile){
					
					System.out.println("Confirm profile: "+loginProfile);
					// Send au serveur idProfile
					eConf.EnvoiDemandeAuServeur(Constantes.CONFIRMATION_PROFILE, loginProfile);
					eConf.RecoiReponseDuServeur();
				}
			// L'admin ne confirme pas la demande de profile
				if (!confirmProfile){
					System.out.println("Cancel profile: "+loginProfile);
					// Send au serveur idProfile
					eConf.EnvoiDemandeAuServeur(Constantes.SUPPRESSION_PROFILE, loginProfile);
					eConf.RecoiReponseDuServeur();
				}
			}
			
			//Modification YO
			//////////////////////////////////////////////////////////////////
			//////////////////////////////////////////////////////////////////
			//////////////////////////////////////////////////////////////////
			//////////////////////////////////////////////////////////////////
			//////////////////////////////////////////////////////////////////
			//////////////////////////////////////////////////////////////////
			//////////////////////////////////////////////////////////////////
			//////////////////////////////////////////////////////////////////
			//////////////////////////////////////////////////////////////////
			// Visualisation graphique de a supervision
			if (arg0.getActionCommand().equals("Visualisation graphique")){
				System.out.println("Clic Visualisation graphique");
				// collecte des infos envoie au serveur les infos	
				
				String[] args = null;
				afficheBodyGraphSupervision.main(args);
				
				System.out.println("Quit la classe Control");
				
			}
			
			if (arg0.getActionCommand().equals("Actualiser les informations")){
				System.out.println("Actualiser les informations");
				// collecte des infos envoie au serveur les infos	
				
				etatControl = Constantes.SUPERVISION;
				// Demande au serveur une réponse a cette requete
				eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_INFO_SUPERVISION, "Demande des infos de supervision");
				//Reception de la réponse
				Object[][] tabInfosSupervisionDuServeur = eConf.ReceptionObjet2DFromClientSupervision();
				fenetre.afficheBodySupervision(tabInfosSupervisionDuServeur);
				
				System.out.println("Quit la classe Control");
				
			}
			///////////////////////////////////////////////////////////////////////////
			///////////////////////////////////////////////////////////////////////////
			///////////////////////////////////////////////////////////////////////////
			//Fin modification YO
					
		
	}

	
}